// 访问修饰符是面向对象语言封装性的体现，可以修饰类的方法或者变量
// public（默认）: 公有的，所有地方都可以访问。
// private: 私有的，只有类的内部能够访问（即使是子类也不能访问）。
// protected: 保护的，类的内部和子类可以访问。

/*
* 如果一个类的构造方法被private修饰
*  1: 该类不能在外部使用new来创建新的实例
*  2: 该类不能被其它类继承、
* 那么：如何得到该类的实例，在类的内部提供工厂方法（工厂方法都是静态方法）来创建实例（工厂模式、单例模式）
*/

class Car {

    // 普通属性（可以没有默认值）
    private name:string;

    // 受保护变量
    protected speed:number;

    private static instance:Car;

    // 构造方法
    constructor(name:string) {
        this.name = name;
    }

    // 方法：需要实现
    public disp():void {
        console.log("该汽车的名字是：",this.name);
    }

    protected setSpeed(speed:number) {
        this.speed = speed;
    }

    public getSpeed():number {
        return this.speed;
    }
}

class SportCar extends Car {
    // 使用名称和速度，构造跑车
    constructor(name:string,speed:number) {
        super(name);
        // setSpeed是protected方法，子类可以调用
        this.setSpeed(speed);
    }

    // 方法重写
    public show():void {
        console.log("该跑车的速度是：",this.getSpeed());
    }
}



let car = new Car("奔驰");
// 报错，name是私有属性，不能访问
// car.name

// 父类的引用，指向子类的示例，该对象只能调用父类申明的方法
let sportCar:Car = new SportCar("宝马",120);
sportCar.disp();
